<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace User\Model;

use Think\Model;

/**
 * 会员模型
 */
class UcenterMemberModel extends Model {
	/**
	 * 数据表前缀
	 * 
	 * @var string
	 */
	protected $tablePrefix = UC_TABLE_PREFIX;
	
	/**
	 * 数据库连接
	 * 
	 * @var string
	 */
	protected $connection = UC_DB_DSN;
	
	/* 用户模型自动验证 */
	protected $_validate = array(
		/* 验证用户名 */
		array (
					'username',
					'1,30',
					- 1,
					self::EXISTS_VALIDATE,
					'length' 
			), // 用户名长度不合法
			array (
					'username',
					'checkDenyMember',
					- 2,
					self::EXISTS_VALIDATE,
					'callback' 
			), // 用户名禁止注册
			array (
					'username',
					'',
					- 3,
					self::EXISTS_VALIDATE,
					'unique' 
			), // 用户名被占用
			
			/* 验证密码 */
			array (
					'password',
					'6,30',
					- 4,
					self::EXISTS_VALIDATE,
					'length' 
			), // 密码长度不合法
			
			/* 验证邮箱 */
			array (
					'email',
					'email',
					- 5,
					self::EXISTS_VALIDATE 
			), // 邮箱格式不正确
			array (
					'email',
					'1,32',
					- 6,
					self::EXISTS_VALIDATE,
					'length' 
			), // 邮箱长度不合法
			array (
					'email',
					'checkDenyEmail',
					- 7,
					self::EXISTS_VALIDATE,
					'callback' 
			), // 邮箱禁止注册
			array (
					'email',
					'',
					- 8,
					self::EXISTS_VALIDATE,
					'unique' 
			), // 邮箱被占用
			
			/* 验证手机号码 */
			array (
					'mobile',
					'//',
					- 9,
					self::EXISTS_VALIDATE 
			), // 手机格式不正确 TODO:
			array (
					'mobile',
					'checkDenyMobile',
					- 10,
					self::EXISTS_VALIDATE,
					'callback' 
			), // 手机禁止注册
			array (
					'mobile',
					'',
					- 11,
					self::EXISTS_VALIDATE,
					'unique' 
			) 
	) // 手机号被占用
;
	
	/* 用户模型自动完成 */
	protected $_auto = array (
			array (
					'password',
					'think_ucenter_md5',
					self::MODEL_BOTH,
					'function',
					UC_AUTH_KEY 
			),
			array (
					'reg_time',
					NOW_TIME,
					self::MODEL_INSERT 
			),
			array (
					'reg_ip',
					'get_client_ip',
					self::MODEL_INSERT,
					'function',
					1 
			),
			array (
					'update_time',
					NOW_TIME 
			),
			array (
					'status',
					'getStatus',
					self::MODEL_BOTH,
					'callback' 
			) 
	);
	
	/**
	 * 检测用户名是不是被禁止注册
	 * 
	 * @param string $username
	 *        	用户名
	 * @return boolean ture - 未禁用，false - 禁止注册
	 */
	protected function checkDenyMember($username) {
		return true; // TODO: 暂不限制，下一个版本完善
	}
	
	/**
	 * 检测邮箱是不是被禁止注册
	 * 
	 * @param string $email
	 *        	邮箱
	 * @return boolean ture - 未禁用，false - 禁止注册
	 */
	protected function checkDenyEmail($email) {
		return true; // TODO: 暂不限制，下一个版本完善
	}
	
	/**
	 * 检测手机是不是被禁止注册
	 * 
	 * @param string $mobile
	 *        	手机
	 * @return boolean ture - 未禁用，false - 禁止注册
	 */
	protected function checkDenyMobile($mobile) {
		return true; // TODO: 暂不限制，下一个版本完善
	}
	
	/**
	 * 根据配置指定用户状态
	 * 
	 * @return integer 用户状态
	 */
	protected function getStatus() {
		return true; // TODO: 暂不限制，下一个版本完善
	}
	
	/**
	 * 注册一个新用户
	 * 
	 * @param string $username
	 *        	用户名
	 * @param string $password
	 *        	用户密码
	 * @param string $email
	 *        	用户邮箱
	 * @param string $mobile
	 *        	用户手机号码
	 * @return integer 注册成功-用户信息，注册失败-错误编号
	 */
	public function register($username, $password, $email, $mobile) {
		$data = array (
				'username' => $username,
				'password' => $password,
				'email' => $email,
				'mobile' => $mobile 
		);
		
		// 验证手机
		if (empty ( $data ['mobile'] ))
			unset ( $data ['mobile'] );
			
			/* 添加用户 */
		if ($this->create ( $data )) {
			$uid = $this->add ();
			return $uid ? $uid : 0; // 0-未知错误，大于0-注册成功
		} else {
			return $this->getError (); // 错误详情见自动验证注释
		}
	}
	
	/**
	 * 用户登录认证
	 * 
	 * @param string $username
	 *        	用户名
	 * @param string $password
	 *        	用户密码
	 * @param integer $type
	 *        	用户名类型 （1-用户名，2-邮箱，3-手机，4-UID）
	 * @return integer 登录成功-用户ID，登录失败-错误编号
	 */
	public function login($username, $password, $type = 1) {
		$map = array ();
		switch ($type) {
			case 1 :
				$map ['username'] = $username;
				break;
			case 2 :
				$map ['email'] = $username;
				break;
			case 3 :
				$map ['mobile'] = $username;
				break;
			case 4 :
				$map ['id'] = $username;
				break;
			default :
				return 0; // 参数错误
		}
		
		/* 获取用户数据 */
		$user = $this->where ( $map )->find ();
		if (is_array ( $user ) && $user ['status']) {
			/* 验证用户密码 */
			if (think_ucenter_md5 ( $password, UC_AUTH_KEY ) === $user ['password']) {
				$this->updateLogin ( $user ['id'] ); // 更新用户登录信息
				return $user ['id']; // 登录成功，返回用户ID
			} else {
				return - 2; // 密码错误
			}
		} else {
			return - 1; // 用户不存在或被禁用
		}
	}
	
	/**
	 * 获取用户信息
	 * 
	 * @param string $uid
	 *        	用户ID或用户名
	 * @param boolean $is_username
	 *        	是否使用用户名查询
	 * @return array 用户信息
	 */
	public function info($uid, $is_username = false) {
		$map = array ();
		if ($is_username) { // 通过用户名获取
			$map ['username'] = $uid;
		} else {
			$map ['id'] = $uid;
		}
		
		$user = $this->where ( $map )->field ( 'id,username,email,mobile,status' )->find ();
		if (is_array ( $user ) && $user ['status'] = 1) {
			return array (
					$user ['id'],
					$user ['username'],
					$user ['email'],
					$user ['mobile'] 
			);
		} else {
			return - 1; // 用户不存在或被禁用
		}
	}
	
	/**
	 * 检测用户信息
	 * 
	 * @param string $field
	 *        	用户名
	 * @param integer $type
	 *        	用户名类型 1-用户名，2-用户邮箱，3-用户电话
	 * @return integer 错误编号
	 */
	public function checkField($field, $type = 1) {
		$data = array ();
		switch ($type) {
			case 1 :
				$data ['username'] = $field;
				break;
			case 2 :
				$data ['email'] = $field;
				break;
			case 3 :
				$data ['mobile'] = $field;
				break;
			default :
				return 0; // 参数错误
		}
		
		return $this->create ( $data ) ? 1 : $this->getError ();
	}
	
	/**
	 * 更新用户登录信息
	 * 
	 * @param integer $uid
	 *        	用户ID
	 */
	protected function updateLogin($uid) {
		$data = array (
				'id' => $uid,
				'last_login_time' => NOW_TIME,
				'last_login_ip' => get_client_ip ( 1 ) 
		);
		$this->save ( $data );
	}
	
	/**
	 * 更新用户信息
	 * 
	 * @param int $uid
	 *        	用户id
	 * @param string $password
	 *        	密码，用来验证
	 * @param array $data
	 *        	修改的字段数组
	 * @return true 修改成功，false 修改失败
	 * @author huajie <banhuajie@163.com>
	 */
	public function updateUserFields($uid, $password, $data) {
		if (empty ( $uid ) || empty ( $password ) || empty ( $data )) {
			$this->error = '参数错误！';
			return false;
		}
		
		// 更新前检查用户密码
		if (! $this->verifyUser ( $uid, $password )) {
			$this->error = '验证出错：密码不正确！';
			return false;
		}
		
		// 更新用户信息
		$data = $this->create ( $data );
		if ($data) {
			return $this->where ( array (
					'id' => $uid 
			) )->save ( $data );
		}
		return false;
	}
	
	/**
	 * 验证用户密码
	 * 
	 * @param int $uid
	 *        	用户id
	 * @param string $password_in
	 *        	密码
	 * @return true 验证成功，false 验证失败
	 * @author huajie <banhuajie@163.com>
	 */
	protected function verifyUser($uid, $password_in) {
		$password = $this->getFieldById ( $uid, 'password' );
		if (think_ucenter_md5 ( $password_in, UC_AUTH_KEY ) === $password) {
			return true;
		}
		return false;
	}
}
